package vue;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

import modele.Match;
import modele.Pronostique;
import controleur.Controleur;

@SuppressWarnings("serial")
public class PanelPronostique extends JPanel implements ActionListener{

	private JTable table;
	private JScrollPane scroll;
	private DefaultTableModel model;
	private Controleur ctrl;
	private JButton valider, dernierResultat;
	private int nbLignesRemplies = 0;
	private final int NUM_COL_EQ1 = 2;
	private final int NUM_COL_EQ2 = 3;
	private final int NUM_COL_INFO = 5;
	
	public PanelPronostique(FenetrePrincipale ihm, boolean buttonEnabled)
	{
		
		this.setBorder(BorderFactory.createEmptyBorder(50, 0, 10, 0));
		this.ctrl = ihm.getControleur();
		
			model = new DefaultTableModel() {

	
			    public boolean isCellEditable(int row, int column)
			    {
			    	if(ctrl.getUtilisateurCourant() != null)
			    		return column == NUM_COL_EQ1  || column == NUM_COL_EQ2 || column == NUM_COL_INFO;
			    	else
			    		return false;
			    }
			  }; 
		
		table = new JTable(model); 

		model.addColumn("Date");
		model.addColumn("Equipe 1");
		model.addColumn(" ");
		model.addColumn(" ");
		model.addColumn("Equipe 2"); 
		model.addColumn("Info"); 

		table.setBackground(Color.white);
		table.getColumnModel().getColumn(2).setPreferredWidth(15);
		table.setToolTipText("Equipe 1 | Score Equipe 1 | Score Equipe 2 | Equipe 2");
		table.getColumnModel().getColumn(3).setPreferredWidth(15);
		table.getColumnModel().getColumn(5).setCellRenderer(new ClientsTableButtonRenderer());
	    table.getColumnModel().getColumn(5).setCellEditor(new ClientsTableRenderer(new JCheckBox(), ctrl));
	    
	    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");

		for(Match match : ctrl.getMatchsAPronostiquer()) {
			boolean trouvé = false;
			Date dateNow = new Date();
			if(match.getDate().after(dateNow)) {
				
			
				if(ctrl.getUtilisateurCourant() != null)
				{
					for(Pronostique prono : ctrl.getUtilisateurCourant().getListePronostique())
					{
						Match m = prono.getMatch();
						if(match.getEquipe1().getNom().equals(m.getEquipe1().getNom())
							&& match.getEquipe2().getNom().equals(m.getEquipe2().getNom())
							&& match.getDate().equals(m.getDate())) {

							model.addRow(new Object[]{f.format(match.getDate()), match.getEquipe1().getNom(),prono.getScoreEquipe1()+"",prono.getScoreEquipe2()+"", match.getEquipe2().getNom()});
							trouvé = true;
							nbLignesRemplies++;
							break;
						}
					}
				}
				if(trouvé == false) {
					model.addRow(new Object[]{f.format(match.getDate()), match.getEquipe1().getNom(),"","", match.getEquipe2().getNom()});
					nbLignesRemplies++;
					System.out.println("pas ok");
				}
				
			}
		}
		
		scroll = new JScrollPane(table);
		scroll.setPreferredSize(new Dimension(350, 200));
		
		
		this.add(scroll);
		valider = new JButton("Enregistrer pronostique"); 
		valider.addActionListener(this);
		valider.setEnabled(buttonEnabled);
		valider.setToolTipText("Permet de valider les scores rentrés");
		dernierResultat = new JButton("Voir les 10 derniers résultats");
		dernierResultat.setEnabled(buttonEnabled);
		dernierResultat.addActionListener(this);
		dernierResultat.setToolTipText("Permet de voir les résultats des 10 derniers pronostiques enregistrés");
		this.add(valider);
		this.add(dernierResultat);
		this.setVisible(true);	
	}
	
	public void majContenu() {
		
		int nblignes = table.getRowCount();
	    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");

		for(int i=0; i<nbLignesRemplies; i++)
		{
			System.out.println(table.getRowCount());
			model.removeRow(0);
		}
		nbLignesRemplies = 0;
		for(Match match : ctrl.getMatchsAPronostiquer()) {
			Date dateNow = new Date();
			boolean trouvé = false;

			if(match.getDate().after(dateNow)) {

				if(ctrl.getUtilisateurCourant() != null)
				{
					for(Pronostique prono : ctrl.getUtilisateurCourant().getListePronostique())
					{
						Match m = prono.getMatch();
						if(match.getEquipe1().getNom().equals(m.getEquipe1().getNom())
							&& match.getEquipe2().getNom().equals(m.getEquipe2().getNom())
							&& match.getDate().equals(m.getDate())) {

							model.addRow(new Object[]{f.format(match.getDate()), match.getEquipe1().getNom(),prono.getScoreEquipe1()+"",prono.getScoreEquipe2()+"", match.getEquipe2().getNom()});
							trouvé = true;
							nbLignesRemplies++;
							break;
						}
					}
				}
				if(trouvé == false) {
					model.addRow(new Object[]{f.format(match.getDate()), match.getEquipe1().getNom(),"","", match.getEquipe2().getNom()});
					nbLignesRemplies++;
					System.out.println("pas ok");
				}
			}
		}
		
		scroll.revalidate();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == valider) {
			boolean saisieOK=true;
			int nbRow = table.getRowCount();
			ArrayList<Pronostique> alNewProno = new ArrayList<Pronostique>();
			for(int i =0; i< nbRow; i++)
			{
				String valeur1=(String)table.getModel().getValueAt(i,NUM_COL_EQ1);
				String valeur2=(String)table.getModel().getValueAt(i,NUM_COL_EQ2);
				
				if(!valeur1.equals("") && !valeur2.equals(""))
					{
						try{
					
							Integer score1= Integer.parseInt((String)table.getModel().getValueAt(i,NUM_COL_EQ1));
							Integer score2=Integer.parseInt((String)table.getModel().getValueAt(i,NUM_COL_EQ2));
							if(score1 <0 || score2 <0)
							{
								JOptionPane.showMessageDialog(this, "Erreur : Une nombre est négatif", "Erreur de saisie", JOptionPane.ERROR_MESSAGE);
								saisieOK= false;
							}
							alNewProno.add(new Pronostique(ctrl.getMatchsAPronostiquer().get(i), score1,score2,-1));
					} catch(NumberFormatException n){
						JOptionPane.showMessageDialog(this, "Une valeur saisie n'est pas un nombre", "Erreur de saisie", JOptionPane.ERROR_MESSAGE);
						saisieOK= false;
					}
				}
				else if(!valeur1.equals("") && valeur2.equals("") || valeur1.equals("") && !valeur2.equals("")) {
					saisieOK = false;
					JOptionPane.showMessageDialog(this, "Une valeur a été oubliée", "Erreur de saisie", JOptionPane.ERROR_MESSAGE);
				}					
			}
			System.out.println(saisieOK+" "+alNewProno.size());
			if(saisieOK)
				ctrl.getUtilisateurCourant().setListePronostique(alNewProno);
			System.out.println(ctrl.getUtilisateurCourant().getPseudo());
			System.out.println(ctrl.getUtilisateurCourant().getListePronostique().size() + "enr");
			ctrl.sauvegarderListeUtilisateurs();
		}
		
		if(e.getSource() == dernierResultat) {
			new PopupDernierResultat(ctrl);
		}
	}
	
	public DefaultTableModel getTableModel()
	{
		return model;
	}
	
	public JTable getTable() {
		return table;
	}
	
	class ClientsTableButtonRenderer extends JButton implements TableCellRenderer
	  {
	    public ClientsTableButtonRenderer()
	    {
	      setOpaque(false);
	      this.setText("Infos");
	      this.setToolTipText("Voir information sur ce match");
	    }

	    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
	    {
	      setForeground(Color.black);
	      setBackground(UIManager.getColor("Button.background"));
	      setText("Infos");
	      return this;
	    }
	  }
	  public class ClientsTableRenderer extends DefaultCellEditor
	  {
	    private JButton button;
	    private String label;
	    private boolean clicked;
	    private int row, col;
	    private JTable table;
	    private Controleur controleur;
	    
	    public ClientsTableRenderer(JCheckBox checkBox, Controleur controleur)
	    {
	    
	      super(checkBox);
	      this.controleur = controleur;
	      button = new JButton("Infos");
	      button.setText("Infos");
	      button.setOpaque(true);
	      button.addActionListener(new ActionListener()
	      {
	        public void actionPerformed(ActionEvent e)
	        {
	          fireEditingStopped();
	        }
	      });
	    }
	    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
	    {
	      this.table = table;
	      this.row = row;
	      this.col = column;

	      button.setForeground(Color.black);
	      button.setBackground(UIManager.getColor("Button.background"));
	      label = (value == null) ? "" : value.toString();
	      button.setText("Infos");
	      clicked = true;
	      return button;
	    }
	    public Object getCellEditorValue()
	    {
	      if (clicked)
	      {
	    	  SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd" );
	    	  
	    	  Date date=null;
			try {
				date = f.parse(((String)table.getValueAt(table.getSelectedRow(), 0)));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    	  String equipe1 = (String)table.getValueAt(table.getSelectedRow(),1);
	    	  Match match = controleur.getMatchViaInfo(date, equipe1);
	    	  new PopupInfoMatch(match);
	      }
	      clicked = false;
	      return new String("Infos");
	    }

	    public boolean stopCellEditing()
	    {
	      clicked = false;
	      return super.stopCellEditing();
	    }

	    protected void fireEditingStopped()
	    {
	      super.fireEditingStopped();
	    }
	  }
	
}
